# home/middleware.py

import time
import logging

# 获取一个 logger 实例，我们可以配置它将日志写入文件
logger = logging.getLogger(__name__)

class PerformanceAndLoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # --- 这是请求阶段 ---
        # 在视图函数被调用之前执行的代码

        # 1. 记录请求开始的时间
        start_time = time.time()

        # 2. 获取请求者的 IP 地址
        # 通常需要考虑代理服务器的情况，所以逻辑会稍微复杂一些
        x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if x_forwarded_for:
            ip = x_forwarded_for.split(',')[0]
        else:
            ip = request.META.get('REMOTE_ADDR')

        # 让请求继续往下走，传递给下一个中间件或视图函数
        response = self.get_response(request)

        # --- 这是响应阶段 ---
        # 在视图函数执行完毕，响应即将返回给浏览器时执行的代码

        # 1. 记录请求结束的时间，并计算总耗时
        duration = time.time() - start_time

        # 2. 准备日志信息
        log_message = (
            f"IP: {ip} | "
            f"URL: {request.path} | "
            f"Method: {request.method} | "
            f"Status: {response.status_code} | "
            f"Duration: {duration:.4f}s"
        )

        # 3. 将日志信息写入日志系统
        # 我们可以根据状态码来决定日志的级别
        if response.status_code >= 400:
            logger.error(log_message)
        else:
            logger.info(log_message)

        return response